package QC.MessageBox.beans;

import QC.MessageBox.common.Constants;
import org.apache.commons.lang3.StringUtils;

import java.net.URLEncoder;

/**
 * Created by Andaren on 2017/6/5.
 * Used for: 拼接认证页面的跳转页面的地址
 * https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
 */
public class RedirectUrl {
    // 返回类型
    private static final String RESPONSE_TYPE = "code";
    // 无论直接打开还是做页面302重定向时候，必须带此参数
    private static final String URL_END = "#wechat_redirect";

    private String redirectUrl;         // 授权后重定向的回调链接地址，请使用urlEncode对链接进行处理

    private String scope;               // 应用授权作用域，snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）

    private String state;               // 重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节

    public String getRedirectUrl () {
        StringBuilder urlSb = new StringBuilder();
        urlSb.append("https://open.weixin.qq.com/connect/oauth2/authorize?")
                .append("appid=").append(Constants.WEB_AUTHEN_APPID);
        if (StringUtils.isNotEmpty(redirectUrl)) {
            try {
                urlSb.append("&redirect_uri=").append(URLEncoder.encode(redirectUrl, "utf-8"));
            } catch (Exception e) {
                e.printStackTrace();
                urlSb.append("&redirect_uri=").append("");
            }
        } else {
            urlSb.append("&redirect_uri=").append("");
        }
        urlSb.append("&response_type=").append(RESPONSE_TYPE);
        if (StringUtils.isBlank(scope)) {
            urlSb.append("&scope=").append("snsapi_base");
        } else {
            urlSb.append("&scope=").append(scope);
        }
        urlSb.append("&state=").append(state)
                .append(URL_END);
        return urlSb.toString();
    }

    public RedirectUrl setRedirectUrl(String redirectUrl) {
        this.redirectUrl = redirectUrl;
        return this;
    }

    public String getScope() {
        return scope;
    }

    public RedirectUrl setScope(String scope) {
        this.scope = scope;
        return this;
    }

    public String getState() {
        return state;
    }

    public RedirectUrl setState(String state) {
        this.state = state;
        return this;
    }
}
